/**
 * Copyright 2010 Philippe Beaudoin
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.philbeaudoin.gwtptabsample.client.presenter;

import com.google.gwt.event.shared.GwtEvent.Type;
import com.google.inject.Inject;
import com.philbeaudoin.gwtp.mvp.client.EventBus;
import com.philbeaudoin.gwtp.mvp.client.RequestTabsHandler;
import com.philbeaudoin.gwtp.mvp.client.TabContainerPresenterImpl;
import com.philbeaudoin.gwtp.mvp.client.TabPanel;
import com.philbeaudoin.gwtp.mvp.client.View;
import com.philbeaudoin.gwtp.mvp.client.annotations.ContentSlot;
import com.philbeaudoin.gwtp.mvp.client.annotations.ProxyCodeSplit;
import com.philbeaudoin.gwtp.mvp.client.annotations.RequestTabs;
import com.philbeaudoin.gwtp.mvp.client.annotations.TabInfo;
import com.philbeaudoin.gwtp.mvp.client.proxy.RevealContentEvent;
import com.philbeaudoin.gwtp.mvp.client.proxy.RevealContentHandler;
import com.philbeaudoin.gwtp.mvp.client.proxy.TabContentProxy;
import com.philbeaudoin.gwtptabsample.client.NameTokens;

/**
 * @author Christian Goudreau
 */
public class HomePresenter extends TabContainerPresenterImpl<HomePresenter.MyView, HomePresenter.MyProxy> {
  public interface MyView extends View, TabPanel {}

  /**
   * Use this in leaf presenters, inside their {@link #revealInParent} method.
   */
  @ContentSlot
  public static final Type<RevealContentHandler<?>> TYPE_SetTabContent = new Type<RevealContentHandler<?>>();

  /**
   * This will be the event sent to our "unknown" child presenters, in order for them to register their tabs.
   */
  @RequestTabs
  public static final Type<RequestTabsHandler> TYPE_RequestTabs = new Type<RequestTabsHandler>();

  @ProxyCodeSplit
  @TabInfo(
      container = MainPagePresenter.class, 
      priority = 0, // The second tab in the home tab
      label="Home",
      nameToken = NameTokens.homePage)
  public interface MyProxy extends TabContentProxy<HomePresenter> {}  
  
  @Inject
  public HomePresenter(
      final EventBus eventBus, 
      final MyView view, 
      final MyProxy proxy) {
    super(eventBus, view, proxy, TYPE_SetTabContent, TYPE_RequestTabs);
  }

  @Override
  protected void revealInParent() {
    RevealContentEvent.fire(eventBus, MainPagePresenter.TYPE_SetTabContent, this);
  }
}